#!/usr/bin/env python 3.9
# -*- coding = utr-8 -*-
'''
@Project: DouBan
@File: testBs4_parsing.py
@IDE: PyCharm
@Author: Simon
@Date: 5/3/21  8:06 AM
'''

'''
BeautifulSouup4 将复杂HTML文档转换成一个复杂的树形结构，每一个节点都是 Python 对象，所有对象可以归纳为 4 种：
- Tag
- NavigableString
- BeautifulSoup
- Comment
'''

from bs4 import BeautifulSoup
import re


file = open("./baidu.html", "rb")  # rb: 二进制读取
html = file.read()

# 解析 html
bs = BeautifulSoup(html, "html.parser")  # 解析器：html.parser

# 1. Tag: 标签及其内容：拿到它所找到的第一个内容
# <title></title> 中的东西都有
print(bs.title)
# <a></a> 中的东西都有
print(bs.a)
# <head></head> 中的东西都有
print(bs.head)

# 2. NavigableString：标签中的内容（字符串）
print(bs.title.string)
print(bs.a.attrs)  # 拿到一个标签中所有的属性值

# 3. BeautifulSoup：表示整个文档
print(type(bs))
print(bs)

# 4. Comment：是一个特殊的 NavigableString ，输出的内容不包含注释符号
print(type(bs.a.string))

# ------------------------------------


# 文档的遍历
print(bs.head.contents)
print(bs.head.contents[1])

# 更多的内容搜索文档：https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#


# 文档的搜索
# 1. find_all():直接查找所有的 <a></a>
# 字符串过滤：查找与字符串完全匹配的内容
t_list = bs.find_all("a")

# 正则表达式搜索：使用 search() 方法匹配内容
t_list2 = bs.find_all(re.compile("a"))              # 寻找所有含有 'a' 的内容


# 方法：传入一个函数（方法），根据函数的要求搜索 (了解)
# def name_is_exists(tag):
#     return tag.has_attr("name")
#
#
# t_list3 = bs.find_all(name_is_exists())
# print(t_list3)


# 2. kwargs: 参数

t_listk = bs.find_all(id="head")
print(t_listk)


# 3. text 参数
t_listt = bs.find_all(text="hao123")
print(t_listt)


# 4. limit 参数

t_listl = bs.find_all("a", limit=3)
print(t_listl)


# 5. css 选择器
# 通过标签来查找
print(bs.select('title'))

# 通过 class 来查找
print(bs.select('.mnav'))

# 通过 id 来查找
print(bs.select('#u1'))

print(bs.select("a[class='bri']"))

print(bs.select("head > title"))

t_listCss = bs.select(".mnav ~ .bri")
print(t_listCss[0].get_text())
